package com.cy.comstore.service.impl;

import com.cy.comstore.entity.Cart;
import com.cy.comstore.entity.Product;
import com.cy.comstore.mapper.CartMapper;
import com.cy.comstore.mapper.ProductMapper;
import com.cy.comstore.service.ICartService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cy.comstore.service.ex.AccessDeniedException;
import com.cy.comstore.service.ex.CartNotFoundException;
import com.cy.comstore.service.ex.InsertException;
import com.cy.comstore.vo.CartVO;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Date;
import java.util.Iterator;
import java.util.List;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author xsn
 * @since 2023-03-03
 */
@Service
public class CartServiceImpl implements ICartService {
    @Autowired
    private CartMapper cartMapper;
    @Autowired
    private ProductMapper productMapper;
    @Override
    public void insertCart(Integer uid, Integer pid, Integer amount, String username) {
        //先查询购物车该用户该商品是否存在，存在数量+1，不存在则插入
        Cart cart = cartMapper.findByUidAndPid(uid,pid);
        if (cart!=null){
            //
            Integer integer = cartMapper.updateNumByCid(cart.getCid(), cart.getNum() + amount, username, new Date());
            if (integer!=1){
                throw new InsertException("修改商品数量时出现未知错误，请联系系统管理员");
            }
        }else {
            Cart cart1 = new Cart();
            // 封装数据：uid,pid,amount
            cart1.setUid(uid);
            cart1.setPid(pid);
            cart1.setNum(amount);
            //设置购物车某条数据价格要通过商品pid来获取
            Product product = productMapper.findById(pid);
            cart1.setPrice(product.getPrice());
            // 封1装数据：4个日志
            cart1.setCreatedUser(username);
            cart1.setCreatedTime(new Date());
            cart1.setModifiedUser(username);
            cart1.setModifiedTime(new Date());
            //插入到数据库中
            Integer rows = cartMapper.insert(cart1);
            if (rows != 1) {
                //插入失败，抛出异常
                throw new InsertException("添加购物车数据出现未知错误，请联系系统管理员");
            }
        }
    }

    @Override
    public List<CartVO> getVOByUid(Integer uid) {
        return  cartMapper.findVOByUid(uid);
    }

    @Override
    public Integer addNum(Integer cid, Integer uid, String username) {
        // 调用findByCid(cid)根据参数cid查询购物车数据
        Cart result = cartMapper.findByCid(cid);
        // 判断查询结果是否为null
        if (result == null) {
            // 是：抛出CartNotFoundException
            throw new CartNotFoundException("尝试访问的购物车数据不存在");
        }

        // 判断查询结果中的uid与参数uid是否不一致
        if (!result.getUid().equals(uid)) {
            // 是：抛出AccessDeniedException
            throw new AccessDeniedException("非法访问");
        }

        // 可选：检查商品的数量是否大于多少(适用于增加数量)或小于多少(适用于减少数量)
        // 根据查询结果中的原数量增加1得到新的数量num
        Integer num = result.getNum() + 1;

        // 创建当前时间对象，作为modifiedTime
        Date now = new Date();
        // 调用updateNumByCid(cid, num, modifiedUser, modifiedTime)执行修改数量
        Integer rows = cartMapper.updateNumByCid(cid, num, username, now);
        if (rows != 1) {
            throw new InsertException("修改商品数量时出现未知错误，请联系系统管理员");
        }

        // 返回新的数量
        return num;
    }

    @Override
    public List<CartVO> getVOByCids(Integer uid, Integer[] cids) {
        List<CartVO> cartVOS = cartMapper.findVOByCids(cids);
        //遍历集合，检查数据是否属于当前用户的
        Iterator<CartVO> iterator = cartVOS.iterator();
        if (iterator.hasNext()){
            CartVO next = iterator.next();
            if (!next.getUid().equals(uid)){
                //当前数据不属于当前用户，从集合中移除该元素
                cartVOS.remove(next);
            }
        }
        return cartVOS;
    }

    @Override
    public Integer subNum(Integer cid, Integer uid, String username) {
        // 调用findByCid(cid)根据参数cid查询购物车数据
        Cart result = cartMapper.findByCid(cid);
        // 判断查询结果是否为null
        if (result == null) {
            // 是：抛出CartNotFoundException
            throw new CartNotFoundException("尝试访问的购物车数据不存在");
        }

        // 判断查询结果中的uid与参数uid是否不一致
        if (!result.getUid().equals(uid)) {
            // 是：抛出AccessDeniedException
            throw new AccessDeniedException("非法访问");
        }

        // 可选：检查商品的数量是否大于多少(适用于增加数量)或小于多少(适用于减少数量)
        // 根据查询结果中的原数量增加1得到新的数量num
        if (result.getNum()<=1){
            return 1;
        }
        Integer num = result.getNum() - 1;

        // 创建当前时间对象，作为modifiedTime
        Date now = new Date();
        // 调用updateNumByCid(cid, num, modifiedUser, modifiedTime)执行修改数量
        Integer rows = cartMapper.updateNumByCid(cid, num, username, now);
        if (rows != 1) {
            throw new InsertException("修改商品数量时出现未知错误，请联系系统管理员");
        }
        // 返回新的数量
        return num;
    }

    @Override
    public Boolean deleteByCids(Integer[] cids) {
        return cartMapper.deleteByCids(cids);
    }

}
